import { computed, ref } from 'vue'
import { store } from '../init'
import { acceptHMRUpdate, defineStore } from 'pinia'
import type { LocalUserMessageList, Message, Model } from '@/model'
import { MessageStatus } from '@/model'

// 示例消息数据
const messages: Message[] = [
  {
    id: 1,
    sender: 'user',
    content: '你好，请帮我写一个关于春天的文章。',
    avatar: 'C', // 假设用户头像显示字母C
    status: MessageStatus.TypingDone
  },
  {
    id: 2,
    sender: 'bot',
    content:
      '当然可以。春天，一个充满生机与希望的季节。微风拂过，带来了花草的芬芳；阳光洒下，温暖了冰封的大地。柳枝吐翠，桃花争艳，鸟儿在枝头欢快地歌唱。田野里，农民开始忙碌的耕作，播下希望的种子。公园里，孩子们奔跑嬉戏，享受着春日的暖阳。春天不仅是自然的复苏，更是心灵的焕新。它鼓励我们走出家门，拥抱自然，感受生命的力量。每一片新叶，每一朵花开，都在诉说着春天的故事，一个关于成长、希望和美好的故事。您觉得这个开头怎么样？'
  },
  {
    id: 3,
    sender: 'user',
    content: '很不错，继续写下去。',
    avatar: 'C',
    status: MessageStatus.TypingDone
  },
  {
    id: 4,
    sender: 'bot',
    content:
      '好的。春天的旋律无处不在。小溪解冻，潺潺流水如同轻快的乐章；细雨蒙蒙，滋润万物，洗净冬日的尘埃。燕子归来，在屋檐下筑巢，宣告着温暖的回归。人们也脱下厚重的冬装，换上轻便的春衣，脸上洋溢着轻松愉悦的笑容。在这充满诗意的季节里，无论是漫步在花香弥漫的小径，还是静坐窗前聆听雨声，都能感受到那份宁静与美好。春天，教会我们欣赏平凡中的诗意，珍惜每一个充满活力的瞬间。',
    reference: [],
    status: MessageStatus.TypingDone
  }
]

const models: Model[] = [
  {
    id: '1',
    name: 'GPT-1',
    description: 'GPT-3.5 是 OpenAI 开发的一种基于神经网络的文本生成模型'
  },
  {
    id: '2',
    name: 'GPT-4',
    description: 'GPT-4 是 OpenAI 开发的一种基于神经网络的文本生成模型'
  },
  {
    id: '3',
    name: 'Claude 3',
    description: 'Claude 3 是 Anthropic 开发的一种基于神经网络的文本生成模型'
  },
  {
    id: '4',
    name: 'Claude 3.5',
    description: 'Claude 3.5 是 Anthropic 开发的一种基于神经网络的文本生成模型'
  }
]

const createUserStore = defineStore(
  'user',
  () => {
    /** 是否显示侧边栏 */
    const showSidebar = ref<boolean>(true)

    /** 窗口列表 */
    const windowList = ref<LocalUserMessageList[]>([])

    /** 当前窗口 */
    const currentWindow = ref<LocalUserMessageList | null>(null)

    /** 当前窗口的消息列表 */
    const currentMessageList = computed(() => {
      return currentWindow.value?.messageList
    })

    /** 最后一条消息 */
    const lastMessage = computed(() => {
      return currentMessageList.value?.[currentMessageList.value.length - 1]
    })

    /** 当前窗口的模型 */
    const currentModel = ref<Model>(models[0])

    /** 模型列表 */
    const modelList = ref<Model[]>(models)

    // ================ 测试数据 ================
    function setTestWindowList() {
      windowList.value = [
        {
          id: 1,
          windowName: '窗口1',
          messageList: messages,
          createTime: '2021-01-01'
        },
        {
          id: 2,
          windowName: '窗口2',
          messageList: [...messages, ...messages],
          createTime: '2021-01-01'
        },
        {
          id: 3,
          windowName: '窗口3',
          messageList: [...messages, ...messages, ...messages],
          createTime: '2021-01-01'
        }
      ]
    }

    /** 删除窗口 */
    function deleteWindow(id: number) {
      windowList.value = windowList.value.filter(item => item.id !== id)
    }

    /** 新增窗口 */
    function addWindow(window: LocalUserMessageList) {
      windowList.value.push(window)
    }

    /** 添加消息 */
    function addMessage(message: Message) {
      currentWindow.value?.messageList.push(message)
    }

    return {
      showSidebar,
      windowList,
      setTestWindowList,
      deleteWindow,
      currentWindow,
      currentMessageList,
      lastMessage,
      addMessage,
      addWindow,
      currentModel,
      modelList
    }
  },
  {
    persist: {
      key: 'USR_STORE',
      storage: localStorage
    }
  }
)

/**
 * import.meta.hot 是 Vite 提供的 HMR API，用于检查当前环境是否支持热更新
 * 如果支持热更新（即 import.meta.hot 存在），则执行 && 后面的代码
 * acceptHMRUpdate 是 Pinia 提供的一个函数，用于使 store 支持热更新
 * 当这个文件被修改时，Pinia store (createUserStore) 的状态会被保留，而不会在热更新时重置
 */
import.meta.hot && import.meta.hot.accept(acceptHMRUpdate(createUserStore, import.meta.hot))

/**
 * 注入 Pinia 实例，使其能在组件外使用
 * @see：https://pinia.vuejs.org/zh/core-concepts/outside-component-usage.html#using-a-store-outside-of-a-component
 */
export const useUserStore = () => {
  return createUserStore(store)
}
